package oxim.digital.rxanim; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import rx.Completable; import rx.CompletableSubscriber; import rx.functions.Action1; public final class RxValueAnimator implements Completable.OnSubscribe { private final ValueAnimator valueAnimator; private final Action1<ValueAnimator> valueUpdateAction; private final Action1<ValueAnimator> animationCancelAction; public static RxValueAnimator from(final ValueAnimator valueAnimator, final Action1<ValueAnimator> valueUpdateAction) { return new RxValueAnimator(valueAnimator, valueUpdateAction, aValueAnimator -> {}); } public static RxValueAnimator from(final ValueAnimator valueAnimator, final Action1<ValueAnimator> valueUpdateAction, final Action1<ValueAnimator> animationCancelAction) { return new RxValueAnimator(valueAnimator, valueUpdateAction, animationCancelAction); } private RxValueAnimator(final ValueAnimator valueAnimator, final Action1<ValueAnimator> valueUpdateAction, final Action1<ValueAnimator> animationCancelAction) { this.valueAnimator = valueAnimator; this.valueAnimator.addUpdateListener(valueUpdateAction::call); this.valueUpdateAction = valueUpdateAction; this.animationCancelAction = animationCancelAction; } @Override public void call(final CompletableSubscriber completableSubscriber) { completableSubscriber.onSubscribe(new ClearSubscription(valueAnimator::end)); valueAnimator.addUpdateListener(valueUpdateAction::call); valueAnimator.start(); valueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationCancel(final Animator animation) { animationCancelAction.call(valueAnimator); } @Override public void onAnimationEnd(final Animator animation) { valueAnimator.removeAllListeners(); completableSubscriber.onCompleted(); } }); } public Completable schedule() { return Completable.create(this); } }